home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2001 / MacHack 2001.toast / pc / The Hacks / HFS- / SerialFSServ / SerialClient.c < prev    next >
Encoding:
Text File  |  2001-06-23  |  5.4 KB  |  279 lines

  1. // GenericSerial.c
  2. // Used on Mac & Palm platforms, for both the server/client apps
  3.  
  4. #include "GenericSerial.h"
  5.  
  6. #include <PalmOS.h>
  7.  
  8. #ifndef NULL
  9.     #define NULL (0L)
  10. #endif
  11.  
  12. //static MyPacket    gInPacket;
  13.  
  14. //static char        gInBuf[kMaxExtraDataSize];
  15. //static char        gOutBuf[sizeof(MyPacket) + kMaxExtraDataSize];
  16.  
  17.  
  18. static void Reply(long p1, long p2, long p3, long p4, short dataSize, short result);
  19.  
  20. static void Send(short op, long p1, long p2, long p3, long p4, short dataSize, char* bufP);
  21. static void Receive(short confirmOp, long *p1, long *p2, long *p3, long *p4, short *resultP, char *bufP);
  22.  
  23.  
  24. void Send(short op, long p1, long p2, long p3, long p4, short dataSize, char* bufP) 
  25. {
  26.     MyPacket    outPacket;
  27.     short        err;
  28.         
  29.     // initialize outPacket:
  30.     outPacket.cookie = kCookieValue;
  31.     outPacket.op = op;
  32.     outPacket.dataSize = dataSize;
  33.     outPacket.result = 0;
  34.     outPacket.reserved = 0;
  35.     outPacket.param1 = p1;
  36.     outPacket.param2 = p2;
  37.     outPacket.param3 = p3;
  38.     outPacket.param4 = p4;
  39.     
  40.     err = SerialWrite(sizeof(MyPacket), (char*)&outPacket);
  41.     
  42.     if(err == 0 && dataSize > 0)
  43.     {
  44.         ErrFatalDisplayIf(bufP == 0, "no buffer");
  45.         
  46.         // send extra data, if any:
  47.         err = SerialWrite(dataSize, bufP);
  48.     }
  49.     
  50.     return;
  51. }
  52.  
  53.  
  54. void Receive(short confirmOp, long *p1, long *p2, long *p3, long *p4, short *resultP, char *bufP)
  55. {
  56.     MyPacket    inPacket;
  57.     short err = SerialRead(sizeof(MyPacket), (char*)&inPacket);
  58.     if(err != 0) return; // (0 = noErr = errNone :-)
  59.     
  60.     ErrFatalDisplayIf(inPacket.op != confirmOp, "bad reply");
  61.     
  62.     // check the cookie so we know we're interpreting the data correctly
  63.     if(inPacket.cookie != kCookieValue) return;
  64.     if(inPacket.dataSize > kMaxExtraDataSize) return;
  65.     
  66.     if(p1) *p1 = inPacket.param1;
  67.     if(p2) *p2 = inPacket.param2;
  68.     if(p3) *p3 = inPacket.param3;
  69.     if(p4) *p4 = inPacket.param4;
  70.     if(resultP) *resultP = inPacket.result;
  71.     
  72.     if(inPacket.dataSize > 0)
  73.     {
  74.         ErrFatalDisplayIf(bufP == 0, "no buffer");
  75.         
  76.         if(inPacket.dataSize > kMaxExtraDataSize) return;
  77.         
  78.         err = SerialRead(inPacket.dataSize, bufP);
  79.         if(err != 0) return; // (0 = noErr = errNone :-)
  80.     }
  81.     
  82. }
  83.  
  84. short RemoteFileRead(long filep, long numBytes, long *numBytesRead, char *bufP, char dataStoreBased, long offset)
  85. {
  86.     short result = -1;
  87.     long tempRead;
  88.     char *dataBufP;
  89.     
  90.     result = 0; // (0 == noErr == errNone)
  91.     if(numBytesRead) *numBytesRead = 0;
  92.     
  93.     if(dataStoreBased)
  94.     {
  95.         dataBufP = bufP;
  96.         bufP = MemPtrNew(kMaxExtraDataSize);
  97.         ErrFatalDisplayIf(bufP == 0, "no mem");
  98.     }
  99.     
  100.     while(numBytes > 0 && result == 0)
  101.     {
  102.         tempRead = numBytes;
  103.         if(tempRead > kMaxExtraDataSize) tempRead = kMaxExtraDataSize;
  104.         
  105.         // Send request & receive reply:
  106.         Send(kFileRead, filep, tempRead, 0, 0, 0, NULL);
  107.         Receive(kFileRead, &tempRead, NULL, NULL, NULL, &result, bufP);
  108.         
  109.         // we got tempRead bytes...
  110.         numBytes -= tempRead;
  111.         if(numBytesRead) *numBytesRead += tempRead;
  112.         
  113.         if(dataStoreBased)
  114.         {
  115.             DmWrite(dataBufP, offset, bufP, tempRead);
  116.             offset += tempRead;
  117.         }
  118.         else
  119.         {
  120.             bufP += tempRead;
  121.         }
  122.     }
  123.     
  124.     if(dataStoreBased)
  125.     {
  126.         MemPtrFree(bufP);
  127.     }
  128.     
  129.     
  130.     return result;
  131. }
  132.  
  133.  
  134. short RemoteFileWrite(long filep, long numBytes, long *numWritten, char *bufP)
  135. {
  136.     short result = -1;
  137.     long tempWrit;
  138.     
  139.     result = 0; // (0 == noErr == errNone)
  140.     if(numWritten) *numWritten = 0;
  141.     
  142.     while(numBytes > 0 && result == 0)
  143.     {
  144.         tempWrit = numBytes;
  145.         if(tempWrit > kMaxExtraDataSize) tempWrit = kMaxExtraDataSize;
  146.         
  147.         // Send request & receive reply:
  148.         Send(kFileWrite, filep, tempWrit, 0, 0, tempWrit, bufP);
  149.         Receive(kFileWrite, &tempWrit, NULL, NULL, NULL, &result, NULL);
  150.         
  151.         // we write tempWrit bytes...
  152.         bufP += tempWrit;
  153.         numBytes -= tempWrit;
  154.         if(numWritten) *numWritten += tempWrit;
  155.         
  156.     }
  157.     
  158.     return result;
  159. }
  160.  
  161.  
  162. short RemoteDirIterate(long dirP, long *iteratorP, char *buf, long *size, long *attrP)
  163. {
  164.     short result = -1;
  165.     
  166.     Send(kDirEnumerate, dirP, *iteratorP, 0, 0, 0, NULL);
  167.     Receive(kDirEnumerate, iteratorP, attrP, 0, 0, &result, buf);
  168.     if(size) *size = StrLen(buf);
  169.     
  170.     return result;
  171. }
  172.  
  173. short RemoteFileCreate(char *path)
  174. {
  175.     short result = -1;
  176.     
  177.     Send(kFileCreate, 0, 0, 0, 0, StrLen(path)+1, path);
  178.     Receive(kFileCreate, 0, 0, 0, 0, &result, NULL);
  179.     
  180.     return result;
  181. }
  182. short RemoteDirCreate(char *path)
  183. {
  184.     short result = -1;
  185.     
  186.     Send(kDirCreate, 0, 0, 0, 0, StrLen(path)+1, path);
  187.     Receive(kDirCreate, 0, 0, 0, 0, &result, NULL);
  188.     
  189.     return result;
  190. }
  191.  
  192. short RemoteFileDelete(char *path)
  193. {
  194.     short result = -1;
  195.     
  196.     Send(kFileDelete, 0, 0, 0, 0, StrLen(path)+1, path);
  197.     Receive(kFileDelete, 0, 0, 0, 0, &result, NULL);
  198.     
  199.     return result;
  200. }
  201.  
  202. short RemoteFileOpen(char *path, long perm, long *filePP)
  203. {
  204.     short result = -1;
  205.     
  206.     Send(kFileOpen, perm, 0, 0, 0, StrLen(path)+1, path);
  207.     Receive(kFileOpen, filePP, 0, 0, 0, &result, NULL);
  208.     
  209.     return result;
  210. }
  211.  
  212. short RemoteFileClose(long filep)
  213. {
  214.     short result = -1;
  215.     
  216.     Send(kFileClose, filep, 0, 0, 0, 0, NULL);
  217.     Receive(kFileClose, 0, 0, 0, 0, &result, NULL);
  218.     
  219.     return result;
  220. }
  221.  
  222. short RemoteFileSeek(long filep, short origin, unsigned short offset)
  223. {
  224.     short result = -1;
  225.     
  226.     Send(kFileSeek, filep, origin, offset, 0, 0, NULL);
  227.     Receive(kFileSeek, 0, 0, 0, 0, &result, NULL);
  228.     
  229.     return result;
  230. }
  231.  
  232.  
  233. short RemoteFileSize(long filep, long *size)
  234. {
  235.     short result = -1;
  236.     
  237.     Send(kFileSize, filep, 0, 0, 0, 0, NULL);
  238.     Receive(kFileSize, size, 0, 0, 0, &result, NULL);
  239.     
  240.     return result;
  241. }
  242.  
  243. short RemoteFileResize(long filep, long newsize)
  244. {
  245.     short result = -1;
  246.     
  247.     Send(kFileResize, filep, newsize, 0, 0, 0, NULL);
  248.     Receive(kFileResize, 0, 0, 0, 0, &result, NULL);
  249.     
  250.     return result;
  251. }
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.